package com.cougil.uoc.seghismed.model;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

import com.cougil.uoc.seghismed.model.ciphed.PacientCiphed;

/**
 * Entitat de negoci que representa pròpiament a un Metge
 *
 * @author Ignacio Cougil Jares
 */
@Entity
@Table(
		name="METGE"
)
public class Metge extends Usuari {

	private String especialitat;

	@OneToMany(cascade = { CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE }, fetch = FetchType.EAGER)
	@JoinTable(
			name="METGE_PACIENTCIPHED",
			joinColumns={@JoinColumn(name="IDMETGE")},
			inverseJoinColumns={@JoinColumn(name="IDPACIENTCIPHED")}
	)
	// llista de pacients protegida
	private List<PacientCiphed> llistaPacientsProt = new ArrayList<PacientCiphed>();

	private String numeroColegiat;

	/**
	 * Afegeix un pacient xifrat nou a la llista
	 * @param e {@link PacientCiphed} element a afegir
	 * @return true si la llista no contenia previament l'element a afegir
	 * @see java.util.List#add(java.lang.Object)
	 */
	public boolean addPacientCiphed(PacientCiphed e) {
		return this.llistaPacientsProt.add(e);
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	// @Override
	// public boolean equals(final Object other) {
	// if (!(other instanceof Metge)) {
	// return false;
	// }
	// Metge castOther = (Metge) other;
	// return new EqualsBuilder().appendSuper(super.equals(other))
	// .append(this.numeroColegiat, castOther.numeroColegiat)
	// .append(this.especialitat, castOther.especialitat)
	// .isEquals()
	// && SeghismedUtils.isLlistesIguals(this.llistaPacientsProt,
	// castOther.llistaPacientsProt);
	// }
	/**
	 * @return Retorna el valor de la propietat especialitat
	 */
	public String getEspecialitat() {
		return this.especialitat;
	}
	/**
	 * @return Retorna el valor de la propietat llistaPacientsProt
	 */
	public List<PacientCiphed> getLlistaPacientsProt() {
		return this.llistaPacientsProt;
	}
	/**
	 * @return Retorna el valor de la propietat numeroColegiat
	 */
	public String getNumeroColegiat() {
		return this.numeroColegiat;
	}

	/**
	 * Retorna un iterador amb el conjunt de pacients xifrats associats
	 * @return {@link Iterator} iterador amb el conjunt d'elements
	 * @see java.util.List#iterator()
	 */
	public Iterator<PacientCiphed> iteratorPacientsCiphed() {
		return this.llistaPacientsProt.iterator();
	}
	/**
	 * Retorna el nombre de pacients xifrats associats
	 * @return nombre d'elements
	 * @see java.util.List#size()
	 */
	public int numPacientsCiphed() {
		return this.llistaPacientsProt.size();
	}
	/**
	 * @param especialitat Estableix el valor de la propietat especialitat
	 */
	public void setEspecialitat(String especialitat) {
		this.especialitat = especialitat;
	}

	/**
	 * @param llistaPacientsProt Estableix el valor de la propietat llistaPacientsProt
	 */
	public void setLlistaPacientsProt(List<PacientCiphed> llistaPacientsProt) {
		this.llistaPacientsProt = llistaPacientsProt;
	}
	/**
	 * @param numeroColegiat Estableix el valor de la propietat numeroColegiat
	 */
	public void setNumeroColegiat(String numeroColegiat) {
		this.numeroColegiat = numeroColegiat;
	}

	/**
	 * Retorna el nombre de pacients associats
	 *
	 * @return nombre d'elements
	 * @see java.util.List#size()
	 */
	public int sizePacients() {
		return this.llistaPacientsProt.size();
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
		.appendSuper(super.toString())
		.append("numeroColegiat", this.numeroColegiat)
		.append("especialitat", this.especialitat)
		.append("llistaPacientsProt", this.llistaPacientsProt)
		.toString();
	}



}

